package com.example.cheeseerpadmin.sys.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.cheeseerpadmin.sys.common.DataGridView;
import com.example.cheeseerpadmin.sys.common.ResultObj;
import com.example.cheeseerpadmin.sys.common.WebUtils;
import com.example.cheeseerpadmin.sys.entity.SysNotice;
import com.example.cheeseerpadmin.sys.entity.SysUser;
import com.example.cheeseerpadmin.sys.service.SysNoticeService;
import com.example.cheeseerpadmin.sys.vo.NoticeVo;
import org.apache.shiro.authc.AuthenticationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/notice")
public class NoticeController {
    @Autowired
    public SysNoticeService sysNoticeService;

    @RequestMapping("/loadAllNotice")
    public DataGridView loadAllNotice(NoticeVo noticeVo) {
        Page<SysNotice> page = new Page<SysNotice>(noticeVo.getPage(), noticeVo.getLimit());
        QueryWrapper<SysNotice> queryWrapper = new QueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(noticeVo.getTitle()), "title", noticeVo.getTitle());
        queryWrapper.like(StringUtils.isNotBlank(noticeVo.getOpername()), "opername", noticeVo.getOpername());
        queryWrapper.ge(noticeVo.getStartDate() != null, "createtime", noticeVo.getStartDate());
        queryWrapper.le(noticeVo.getEndDate() != null, "createtime", noticeVo.getEndDate());
        queryWrapper.orderByDesc("createtime");
        Page<SysNotice> sysNoticePage = sysNoticeService.page(page, queryWrapper);
        return new DataGridView(sysNoticePage.getTotal(), sysNoticePage.getRecords());
    }

    @RequestMapping("/deleteNoticeById")
    public ResultObj deleteNoticeById(Integer id) {
        try {
            sysNoticeService.removeById(id);
            return ResultObj.DELETE_SUCCESS;
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }

    @RequestMapping("/batchDeleteNotice")
    public ResultObj batchDeleteNotice(NoticeVo noticeVo) {
        try {
            for (Integer id : noticeVo.getIds()) {
                sysNoticeService.removeById(id);
            }
            return ResultObj.DELETE_SUCCESS;
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }

    @RequestMapping("/addNotice")
    public ResultObj addNotice(NoticeVo noticeVo) {
        try {
            /*这串代码的不足在于重复了一些操作，像title,content等内容那是noticeVo原有的，而NoticeVo本身是继承SysNotice,
             那我们为什么不直接将noticeVo存储呢，而是还要去借助SysNotice,这一步完全可以省略
            SysNotice sysNotice = new SysNotice();
            sysNotice.setTitle(noticeVo.getTitle());
            sysNotice.setContent(noticeVo.getContent());
            sysNotice.setCreatetime(new Date());
            SysUser user = (SysUser) WebUtils.getSession().getAttribute("user");
            sysNotice.setOpername(user.getName());
            sysNoticeService.save(sysNotice);*/

            noticeVo.setCreatetime(new Date());
            SysUser user = (SysUser) WebUtils.getSession().getAttribute("user");
            noticeVo.setOpername(user.getName());
            sysNoticeService.save(noticeVo);
            return ResultObj.ADD_SUCCESS;
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return ResultObj.ADD_ERROR;
        }
    }

    @RequestMapping("/updateNotice")
    public ResultObj updateNotice(NoticeVo noticeVo) {
        try {
            /**
             * 这里之所以可以根据id来进行更新，那是因为前端传递了一个id到noticeVo当中，然后SysNoticeService就可以根据这个id进行修改.
             * 而像我们之前增加公告的时候之所以没有id那是因为，它在打开富文本界面的时候，是没有根据数据行装载数据的，所以自然也就没有id，那么这个id
             * 就是由数据库自动生成的。
             */
            sysNoticeService.updateById(noticeVo);
            return ResultObj.UPDATE_SUCCESS;
        } catch (AuthenticationException e) {
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        }
    }

}
